<?php
class CuentaDAO extends DAO {

    public function select($fields='*', $condition='TRUE', $page='1', $rows_per_page='20', $order_by='id_track', $order_by_type='DESC') {
        $list = array();
        $data = array();
        try {
            $rows = 0;
            $start = intval(($page - 1) * $rows_per_page);
            $query = "SELECT COUNT(id) AS rows FROM cuenta ";
            $query .= "WHERE ".$condition;
            $stmt = $this->dbh->query($query);
            $rows = $stmt->fetchObject()->rows;
            $query = 'SELECT '.$fields.' FROM cuenta ';
            $query .= 'WHERE '.$condition.' ';
            $pages = ceil($rows / $rows_per_page);
            $query .= 'ORDER BY :order_by ';
            $query .= ':order_by_type ';
            $query .= 'LIMIT :start, :rows_per_page ';
            $stmt->closeCursor();
            $stmt = $this->dbh->prepare($query);
            $stmt->bindParam(':start', $start, PDO::PARAM_INT);
            $stmt->bindParam(':rows_per_page', $rows_per_page, PDO::PARAM_INT);
            $stmt->bindParam(':order_by', $order_by);
            $stmt->bindParam(':order_by_type', $order_by_type);
            $stmt->setFetchMode(PDO::FETCH_OBJ);
            $stmt->execute();
            $result = $stmt->fetchAll();
            foreach($result as $row) {
                $objCuentaTO = new CuentaTO();
                $objCuentaTO->setIdCuenta($row->id);
                $objCuentaTO->setUsuario($row->usuario);
                $objCuentaTO->setPassword($row->password);
                $objCuentaTO->setEstado($row->estado);
                $objCuentaTO->setIdPerfil($row->id_perfil);
                $list[count($list) + 1] = $objCuentaTO;
            }
            $data['list'] = $list;
            $data['pages'] = $pages;
            $data['rows'] = $rows;
            return $data;
        }
        catch(Exception $e) {
            throw $e;
        }
    }

    public function load($objCuentaTO) {
        try {
            $query = 'SELECT * FROM cuenta WHERE id_cuenta = :id_cuenta LIMIT 1';
            $stmt = $this->dbh->prepare($query);
            $stmt->bindParam(':id_cuenta', $objCuentaTO->getIdCuenta());
            $stmt->setFetchMode(PDO::FETCH_OBJ);
            $stmt->execute();
            $resultado = $stmt->fetch();
            $objCuentaTO = new CuentaTO();
            $objCuentaTO->setIdCuenta($resultado->id);
            $objCuentaTO->setUsuario($resultado->usuario);
            $objCuentaTO->setPassword($resultado->password);
            $objCuentaTO->setEstado($resultado->estado);
            $objCuentaTO->setIdPerfil($resultado->id_perfil);
            return $objCuentaTO;
        }
        catch(Exception $e) {
            throw $e;
        }
    }

    public function loadByUsuario($objCuentaTO) {
        try {
            $query = 'SELECT * FROM cuenta WHERE usuario = :usuario LIMIT 1';
            $stmt = $this->dbh->prepare($query);
            $stmt->bindParam(':usuario', $objCuentaTO->getUsuario());
            $stmt->setFetchMode(PDO::FETCH_OBJ);
            $stmt->execute();
            $resultado = $stmt->fetch();
            $objCuentaTO = new CuentaTO();
            $objCuentaTO->setIdCuenta($resultado->id_cuenta);
            $objCuentaTO->setUsuario($resultado->usuario);
            $objCuentaTO->setPassword($resultado->password);
            $objCuentaTO->setEstado($resultado->estado);
            $objCuentaTO->setIdPerfil($resultado->id_perfil);
            return $objCuentaTO;
        }
        catch(Exception $e) {
            throw $e;
        }
    }

    public function autenticar($usuario, $password) {
        try {
            $query = 'SELECT * FROM cuenta WHERE usuario = :usuario AND password = :password';
            $stmt = $this->dbh->prepare($query);
            $stmt->bindParam('usuario', $usuario);
            $stmt->bindParam('password', md5($password));
            $stmt->setFetchMode(PDO::FETCH_OBJ);
            $stmt->execute();
            $result = $stmt->fetch();
            if($result) {
                $objCuentaTO = new CuentaTO;
                $objCuentaTO->setIdCuenta($result->id_cuenta);
                $objCuentaTO->setUsuario($result->usuario);
                $objCuentaTO->setPassword($result->password);
                $objCuentaTO->setEstado($result->estado);
                $objCuentaTO->setIdPerfil($result->id_perfil);
                return $objCuentaTO;
            }
            else {
                throw new Exception("<div id='msn_operacion_false'><div style='padding-left:30px;'>Error: La autenticación falló.</div></div>");
            }

        }
        catch(Exception $e) {
            throw $e;
        }
    }

    public function delete($id) {
        try {
            $query = "DELETE FROM cuenta WHERE id_cuenta = :id_cuenta";
            $stmt = $this->dbh->prepare($query);
            $stmt->bindParam('id_cuenta',$id);
            $stmt->execute();
            return "";
        }catch (Exception $e) {
            throw $e;
        }
    }

    protected function update($objetoTO) {
        return "";
    }

    protected function insert($Entidad) {
        require 'conf/conexion.php';
        $usuario = $Entidad->getUsuario();
        $password = md5($Entidad->getPassword());

        $consulta = $db->prepare("INSERT INTO cuenta (usuario, password, estado, id_perfil)
            VALUES ('$usuario','$password','1','3')");

        $consulta->execute();
    }

    public function findLastCuenta() {
        require 'conf/conexion.php';
        $consulta = $db->prepare("SELECT * FROM cuenta ORDER BY id_cuenta desc LIMIT 1");
        $consulta->execute();
        $cuentaList = $consulta->fetchAll();

        foreach($cuentaList as $cuentaData) {
            $cuentaObject = new CuentaTO;
            $cuentaObject->setIdCuenta($cuentaData['id_cuenta']);
            $cuentaObject->setUsuario($cuentaData['usuario']);
            $cuentaObject->setPassword($cuentaData['password']);
            $cuentaObject->setEstado($cuentaData['estado']);
            $cuentaObject->setIdPerfil($cuentaData['id_perfil']);
        }

        return $cuentaObject;
    }
}
?>
